/*
* Copyright (c) 2016 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
*/
package com.hyyt.shopjsp.util.validate;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import com.hyyt.shopjsp.util.redis.service.IRedisBasicService;
import com.hyyt.shopjsp.util.common.Token;
import com.hyyt.shopjsp.util.common.Utils;

/**
 * @作用：从redis中验证用户token信息
 * @功能：
 * @作者:
 * @日期：2016年2月25日 上午9:30:59 
 * @版本：V1.0
 */
@Service
public class ValidateTokenService {
	@Resource
	private IRedisBasicService redisBasicService;
	
	/**
	 * @功能：根据用户id验证用户token是否有效
	 * @作者: 
	 * @参数： @param customerToken 用户请求时的token
	 * @参数： @param customerId 用户id
	 * @参数： @return
	 * @返回值：Map<String,Object>
	 * @日期: 2016年2月25日 上午9:38:24 
	 */
	public Map<String,Object> validateCustomerToken(String customerToken,Integer customerId){
		String redisToken ="";
		if(Utils.objectIsNotEmpty(customerToken)){
			redisToken=redisBasicService.getValue(customerToken);
//			System.out.println("redisBasicService中的token:"+redisToken);
		}
		//token验证是否通过，默认为通过
				boolean flag = true;
				//错误信息
				String message = "";
				//错误码
				String errorCode="";
				/*
				 * 1、如果请求参数中未传递token值则让用户重新登录
				 * 2、如果session中的值为空则让用户重新登录
				 * 3、与session中的token对比是否一样,如果不一样则用户重新登录
				 * 4、验证用户token时间是否超时，超时则重新获取token
				 */
				if(Utils.stringIsNotEmpty(customerToken)&&Utils.objectIsNotEmpty(redisToken)&&redisToken.equals(customerToken)){
					//验证是否有当前用户ID
					if(customerToken.indexOf("_"+customerId+"_")>0){
						//验证用户是否超时
						flag = Token.compareToken(customerToken);
						if(!flag){
							customerToken = Token.getNewToken(customerToken);
							long tokenTime = 60l;
							if(Utils.objectIsNotEmpty(Utils.mapSystemConfig.get("tokenTime"))&&Integer.valueOf(String.valueOf(Utils.mapSystemConfig.get("tokenTime")))>0){
								tokenTime=tokenTime*60*Integer.valueOf(String.valueOf(Utils.mapSystemConfig.get("tokenTime")));
							}
							//保存一个键值对数据 同时设置过期时间(秒)
							redisBasicService.setKey(customerToken, customerToken,tokenTime);
//							System.out.println("最新的token:"+customerToken);
							message="当前的用户token超时重新生成";
							errorCode="00101";
							flag = false;
						}
					}else{
						message="用户token信息被修改，请重新登录";
						errorCode="00102";
						flag = false;
					}
				}else{
					message="未找到当前的用户token，请重新登录";
					errorCode="00103";
					flag = false;
				}
		if(!flag){
			Map<String,Object> map=new HashMap<String,Object>();
			map.put("success",flag);
			map.put("message", message);
			map.put("errorCode", errorCode);
			map.put("customerToken", customerToken);
			return map;
		}else{
			return null;
		}
	}
}
